{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Mentions Extraction for KBQA\n",
    "\n",
    "Parsing question into entities and predicate mentions text spans.\n",
    "\n",
    "bi-LSTM + CRF  \n",
    "https://github.com/UKPLab/emnlp2017-bilstm-cnn-crf  \n",
    "https://www.depends-on-the-definition.com/sequence-tagging-lstm-crf/  \n",
    "https://github.com/SNUDerek/multiLSTM  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "# setup\n",
    "dataset_name = 'lcquad'\n",
    "embeddings_choice = 'glove6B100d'\n",
    "\n",
    "import numpy as np\n",
    "# set seed\n",
    "from numpy.random import seed\n",
    "seed(1)\n",
    "from tensorflow import set_random_seed\n",
    "set_random_seed(2)\n",
    "\n",
    "import os\n",
    "os.chdir('/home/zola/Projects/KBQA/src')\n",
    "\n",
    "# load word frequencies\n",
    "import pickle\n",
    "wfd = pickle.load(open(\"wfd.pkl\", \"rb\"))\n",
    "\n",
    "# make sure Keras is using the GPU\n",
    "from keras import backend\n",
    "assert len(backend.tensorflow_backend._get_available_gpus()) > 0\n",
    "\n",
    "# load pre-trained word embeddings\n",
    "from pymagnitude import *\n",
    "embeddings_path = \"/home/zola/Projects/KBQA/data/embeddings/\"\n",
    "embeddings = {'glove6B100d': \"glove.6B.100d.magnitude\"}\n",
    "vectors = Magnitude(embeddings_path + embeddings[embeddings_choice])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loaded 5000/5000 lcquad questions\n"
     ]
    }
   ],
   "source": [
    "# load lcquad span annotations\n",
    "# wget https://raw.githubusercontent.com/AskNowQA/EARL/master/data/lcquad.json\n",
    "import json\n",
    "with open(\"../data/%s.json\"%dataset_name, \"r\") as file:\n",
    "    qas = json.load(file)\n",
    "\n",
    "# prepare data for entity and predicate mention extraction models training via sequence tagging\n",
    "limit = 5000\n",
    "from keras.preprocessing.text import text_to_word_sequence\n",
    "\n",
    "questions = []\n",
    "n_words_distr = []\n",
    "\n",
    "e_spans = []\n",
    "y_e = []\n",
    "correct_entities_uris = []\n",
    "\n",
    "p_spans = []\n",
    "y_p = []\n",
    "correct_predicates_uris = []\n",
    "\n",
    "for q in qas[:limit]:\n",
    "    # parse question\n",
    "    question_o = q['question']\n",
    "    words = text_to_word_sequence(question_o)\n",
    "    n_words_distr.append(len(words))\n",
    "    questions.append(words)\n",
    "\n",
    "    # generate IO tags from mention spans\n",
    "    entity_spans = [e['label'].lower().split() for e in q['entity mapping']]\n",
    "    e_spans.append(entity_spans)\n",
    "    y_e.append([1 if word in [entity for entity_span in entity_spans for entity in entity_span] else 0 for word in words])\n",
    "    correct_entities_uris.append([e['uri'] for e in q['entity mapping']])\n",
    "    \n",
    "    predicate_spans = [e['label'].lower().split() for e in q['predicate mapping']]\n",
    "    p_spans.append(predicate_spans)\n",
    "    y_p.append([1 if word in [entity for entity_span in predicate_spans for entity in entity_span] else 0 for word in words])\n",
    "    correct_predicates_uris.append([e['uri'] for e in q['predicate mapping']])\n",
    "\n",
    "dataset_size = len(questions)\n",
    "print(\"Loaded %d/%d %s questions\"%(dataset_size, len(qas), dataset_name))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Was winston churchill the prime minister of Selwyn Lloyd?\n",
      "\n",
      "\n",
      "[['selwyn', 'lloyd'], ['winston', 'churchill']]\n",
      "[0, 1, 1, 0, 0, 0, 0, 1, 1]\n",
      "['http://dbpedia.org/resource/Selwyn_Lloyd', 'http://dbpedia.org/resource/Winston_Churchill']\n",
      "\n",
      "\n",
      "[['prime', 'minister']]\n",
      "[0, 0, 0, 0, 1, 1, 0, 0, 0]\n",
      "['http://dbpedia.org/ontology/primeMinister']\n"
     ]
    }
   ],
   "source": [
    "# show sample question\n",
    "i = 1\n",
    "question_o = qas[i]['question']\n",
    "print(question_o)\n",
    "print('\\n')\n",
    "print(e_spans[i])\n",
    "print(y_e[i])\n",
    "print(correct_entities_uris[i])\n",
    "print('\\n')\n",
    "print(p_spans[i])\n",
    "print(y_p[i])\n",
    "print(correct_predicates_uris[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of unique words 7113\n",
      "Maximum question length in the dataset: 25\n",
      "916 OOV words\n",
      "Model settings saved.\n"
     ]
    }
   ],
   "source": [
    "# load pre-trained embeddings for question words\n",
    "words = list(set([word for q in questions for word in q]))\n",
    "n_words = len(words)\n",
    "print(\"Number of unique words %d\"%len(words))\n",
    "word2idx = {w: i + 1 for i, w in enumerate(words)}\n",
    "\n",
    "# dataset parameters for training the model\n",
    "max_len = max(n_words_distr)\n",
    "print(\"Maximum question length in the dataset: %d\"%max_len)\n",
    "n_tags = 2\n",
    "\n",
    "# prepare data and pad the max length with 0s\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "X = [[word2idx[w] for w in s] for s in questions]\n",
    "X = pad_sequences(maxlen=max_len, sequences=X, padding=\"post\", value=0)\n",
    "\n",
    "# load embeddings into matrix\n",
    "import math\n",
    "word_embedding_matrix = np.zeros((n_words+1, vectors.dim))\n",
    "\n",
    "n_oov = 0\n",
    "\n",
    "for w in word2idx:\n",
    "    # get the word vector from the embedding model\n",
    "    if w in vectors:\n",
    "        word_vector = vectors.query(w)\n",
    "    # OOV word\n",
    "    else:\n",
    "        n_oov += 1\n",
    "        word_vector = vectors.query('unk')\n",
    "    word_embedding_matrix[word2idx[w]] = word_vector\n",
    "\n",
    "# loaded vector # may be lower than total vocab due to w2v settings\n",
    "print('%d OOV words'%n_oov)\n",
    "\n",
    "model_settings = {'embeddings': word_embedding_matrix, 'word2idx': word2idx,\n",
    "                  'max_len': max_len, 'n_words': n_words, 'n_tags': n_tags, 'emb_dim': vectors.dim}\n",
    "\n",
    "# save model settings\n",
    "import pickle as pkl\n",
    "f = open('%s_%s.pkl'%(dataset_name, embeddings_choice), 'wb')\n",
    "pkl.dump(model_settings, f, -1)\n",
    "f.close()\n",
    "print(\"Model settings saved.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zola/anaconda3/envs/tf36/lib/python3.6/site-packages/keras_contrib/layers/crf.py:314: UserWarning: CRF.loss_function is deprecated and it might be removed in the future. Please use losses.crf_loss instead.\n",
      "  warnings.warn('CRF.loss_function is deprecated and it might be removed in the future. Please '\n",
      "/home/zola/anaconda3/envs/tf36/lib/python3.6/site-packages/keras_contrib/layers/crf.py:320: UserWarning: CRF.accuracy is deprecated and it might be removed in the future. Please use metrics.crf_accuracy\n",
      "  warnings.warn('CRF.accuracy is deprecated and it might be removed in the future. Please '\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 25)                0         \n",
      "_________________________________________________________________\n",
      "embedding_1 (Embedding)      (None, 25, 100)           711400    \n",
      "_________________________________________________________________\n",
      "bidirectional_1 (Bidirection (None, 25, 100)           60400     \n",
      "_________________________________________________________________\n",
      "time_distributed_1 (TimeDist (None, 25, 50)            5050      \n",
      "_________________________________________________________________\n",
      "crf_1 (CRF)                  (None, 25, 2)             110       \n",
      "=================================================================\n",
      "Total params: 776,960\n",
      "Trainable params: 65,560\n",
      "Non-trainable params: 711,400\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# build biLSTM-CRF model for mention extraction\n",
    "from keras.models import Model, Input\n",
    "from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional\n",
    "from keras_contrib.layers import CRF\n",
    "from keras.optimizers import Adam\n",
    "\n",
    "def build_model(model_settings):\n",
    "    # architecture\n",
    "    input = Input(shape=(model_settings['max_len'],))\n",
    "    model = Embedding(input_dim=model_settings['n_words']+1, output_dim=model_settings['emb_dim'],\n",
    "                      weights=[model_settings['embeddings']],\n",
    "                      input_length=model_settings['max_len'], mask_zero=True, trainable=False)(input)\n",
    "    model = Bidirectional(LSTM(units=50, return_sequences=True,\n",
    "                               recurrent_dropout=0.1))(model)  # variational biLSTM\n",
    "    model = TimeDistributed(Dense(50, activation=\"relu\"))(model)  # a dense layer as suggested by neuralNer\n",
    "    crf = CRF(model_settings['n_tags'])  # CRF layer\n",
    "    out = crf(model)  # output\n",
    "    model = Model(input, out)\n",
    "    model.compile(optimizer=Adam(lr=0.0001), loss=crf.loss_function, metrics=[crf.accuracy])\n",
    "    model.summary()\n",
    "    return model\n",
    "\n",
    "model = build_model(model_settings)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Entity mentions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training on 4500 samples validating on 500 samples\n"
     ]
    }
   ],
   "source": [
    "# train entity mention span model\n",
    "y = y_e\n",
    "modelname = 'entity_model'\n",
    "\n",
    "# prepare data\n",
    "y = pad_sequences(maxlen=max_len, sequences=y, padding=\"post\", value=0)\n",
    "from keras.utils import to_categorical\n",
    "y = [to_categorical(i, num_classes=n_tags) for i in y]\n",
    "\n",
    "# split dataset into training and testing subsets\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)\n",
    "print(\"Training on %d samples testing on %d samples\" % (len(X_train), len(X_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 4050 samples, validate on 450 samples\n",
      "Epoch 1/50\n",
      "4050/4050 [==============================] - 9s 2ms/step - loss: 1.5556 - crf_viterbi_accuracy: 0.7536 - val_loss: 1.5301 - val_crf_viterbi_accuracy: 0.7721\n",
      "Epoch 2/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.4693 - crf_viterbi_accuracy: 0.7862 - val_loss: 1.4804 - val_crf_viterbi_accuracy: 0.8009\n",
      "Epoch 3/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.4237 - crf_viterbi_accuracy: 0.8129 - val_loss: 1.4297 - val_crf_viterbi_accuracy: 0.8254\n",
      "Epoch 4/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3732 - crf_viterbi_accuracy: 0.8395 - val_loss: 1.3802 - val_crf_viterbi_accuracy: 0.8491\n",
      "Epoch 5/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3353 - crf_viterbi_accuracy: 0.8609 - val_loss: 1.3507 - val_crf_viterbi_accuracy: 0.8659\n",
      "\n",
      "Epoch 00005: val_loss improved from inf to 1.35068, saving model to checkpoints/_entity_model05-0.87.h5\n",
      "Epoch 6/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3145 - crf_viterbi_accuracy: 0.8735 - val_loss: 1.3347 - val_crf_viterbi_accuracy: 0.8755\n",
      "Epoch 7/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3012 - crf_viterbi_accuracy: 0.8810 - val_loss: 1.3237 - val_crf_viterbi_accuracy: 0.8811\n",
      "Epoch 8/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2907 - crf_viterbi_accuracy: 0.8850 - val_loss: 1.3156 - val_crf_viterbi_accuracy: 0.8857\n",
      "Epoch 9/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2830 - crf_viterbi_accuracy: 0.8882 - val_loss: 1.3087 - val_crf_viterbi_accuracy: 0.8880\n",
      "Epoch 10/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2763 - crf_viterbi_accuracy: 0.8911 - val_loss: 1.3039 - val_crf_viterbi_accuracy: 0.8897\n",
      "\n",
      "Epoch 00010: val_loss improved from 1.35068 to 1.30390, saving model to checkpoints/_entity_model10-0.89.h5\n",
      "Epoch 11/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2697 - crf_viterbi_accuracy: 0.8946 - val_loss: 1.2991 - val_crf_viterbi_accuracy: 0.8918\n",
      "Epoch 12/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2655 - crf_viterbi_accuracy: 0.8967 - val_loss: 1.2961 - val_crf_viterbi_accuracy: 0.8933\n",
      "Epoch 13/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2622 - crf_viterbi_accuracy: 0.8966 - val_loss: 1.2933 - val_crf_viterbi_accuracy: 0.8971\n",
      "Epoch 14/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2588 - crf_viterbi_accuracy: 0.8994 - val_loss: 1.2910 - val_crf_viterbi_accuracy: 0.8987\n",
      "Epoch 15/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2551 - crf_viterbi_accuracy: 0.9016 - val_loss: 1.2883 - val_crf_viterbi_accuracy: 0.8971\n",
      "\n",
      "Epoch 00015: val_loss improved from 1.30390 to 1.28829, saving model to checkpoints/_entity_model15-0.90.h5\n",
      "Epoch 16/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2530 - crf_viterbi_accuracy: 0.9027 - val_loss: 1.2861 - val_crf_viterbi_accuracy: 0.9008\n",
      "Epoch 17/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2498 - crf_viterbi_accuracy: 0.9033 - val_loss: 1.2845 - val_crf_viterbi_accuracy: 0.9012\n",
      "Epoch 18/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2473 - crf_viterbi_accuracy: 0.9047 - val_loss: 1.2829 - val_crf_viterbi_accuracy: 0.9042\n",
      "Epoch 19/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2452 - crf_viterbi_accuracy: 0.9053 - val_loss: 1.2812 - val_crf_viterbi_accuracy: 0.9039\n",
      "Epoch 20/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2431 - crf_viterbi_accuracy: 0.9074 - val_loss: 1.2799 - val_crf_viterbi_accuracy: 0.9057\n",
      "\n",
      "Epoch 00020: val_loss improved from 1.28829 to 1.27990, saving model to checkpoints/_entity_model20-0.91.h5\n",
      "Epoch 21/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2406 - crf_viterbi_accuracy: 0.9080 - val_loss: 1.2784 - val_crf_viterbi_accuracy: 0.9065\n",
      "Epoch 22/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2406 - crf_viterbi_accuracy: 0.9080 - val_loss: 1.2781 - val_crf_viterbi_accuracy: 0.9032\n",
      "Epoch 23/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2386 - crf_viterbi_accuracy: 0.9084 - val_loss: 1.2756 - val_crf_viterbi_accuracy: 0.9062\n",
      "Epoch 24/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2376 - crf_viterbi_accuracy: 0.9085 - val_loss: 1.2748 - val_crf_viterbi_accuracy: 0.9062\n",
      "Epoch 25/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2357 - crf_viterbi_accuracy: 0.9094 - val_loss: 1.2736 - val_crf_viterbi_accuracy: 0.9067\n",
      "\n",
      "Epoch 00025: val_loss improved from 1.27990 to 1.27364, saving model to checkpoints/_entity_model25-0.91.h5\n",
      "Epoch 26/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2343 - crf_viterbi_accuracy: 0.9101 - val_loss: 1.2724 - val_crf_viterbi_accuracy: 0.9072\n",
      "Epoch 27/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2331 - crf_viterbi_accuracy: 0.9108 - val_loss: 1.2714 - val_crf_viterbi_accuracy: 0.9080\n",
      "Epoch 28/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2322 - crf_viterbi_accuracy: 0.9111 - val_loss: 1.2704 - val_crf_viterbi_accuracy: 0.9090\n",
      "Epoch 29/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2301 - crf_viterbi_accuracy: 0.9123 - val_loss: 1.2696 - val_crf_viterbi_accuracy: 0.9077\n",
      "Epoch 30/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2290 - crf_viterbi_accuracy: 0.9124 - val_loss: 1.2685 - val_crf_viterbi_accuracy: 0.9097\n",
      "\n",
      "Epoch 00030: val_loss improved from 1.27364 to 1.26853, saving model to checkpoints/_entity_model30-0.91.h5\n",
      "Epoch 31/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2281 - crf_viterbi_accuracy: 0.9121 - val_loss: 1.2685 - val_crf_viterbi_accuracy: 0.9113\n",
      "Epoch 32/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2273 - crf_viterbi_accuracy: 0.9121 - val_loss: 1.2674 - val_crf_viterbi_accuracy: 0.9094\n",
      "Epoch 33/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2262 - crf_viterbi_accuracy: 0.9135 - val_loss: 1.2669 - val_crf_viterbi_accuracy: 0.9115\n",
      "Epoch 34/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2244 - crf_viterbi_accuracy: 0.9142 - val_loss: 1.2665 - val_crf_viterbi_accuracy: 0.9103\n",
      "Epoch 35/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2239 - crf_viterbi_accuracy: 0.9143 - val_loss: 1.2662 - val_crf_viterbi_accuracy: 0.9114\n",
      "\n",
      "Epoch 00035: val_loss improved from 1.26853 to 1.26623, saving model to checkpoints/_entity_model35-0.91.h5\n",
      "Epoch 36/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2234 - crf_viterbi_accuracy: 0.9146 - val_loss: 1.2656 - val_crf_viterbi_accuracy: 0.9099\n",
      "Epoch 37/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2227 - crf_viterbi_accuracy: 0.9141 - val_loss: 1.2631 - val_crf_viterbi_accuracy: 0.9114\n",
      "Epoch 38/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2213 - crf_viterbi_accuracy: 0.9150 - val_loss: 1.2622 - val_crf_viterbi_accuracy: 0.9124\n",
      "Epoch 39/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2212 - crf_viterbi_accuracy: 0.9152 - val_loss: 1.2615 - val_crf_viterbi_accuracy: 0.9139\n",
      "Epoch 40/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2193 - crf_viterbi_accuracy: 0.9165 - val_loss: 1.2612 - val_crf_viterbi_accuracy: 0.9127\n",
      "\n",
      "Epoch 00040: val_loss improved from 1.26623 to 1.26118, saving model to checkpoints/_entity_model40-0.91.h5\n",
      "Epoch 41/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2188 - crf_viterbi_accuracy: 0.9167 - val_loss: 1.2602 - val_crf_viterbi_accuracy: 0.9124\n",
      "Epoch 42/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2173 - crf_viterbi_accuracy: 0.9172 - val_loss: 1.2611 - val_crf_viterbi_accuracy: 0.9122\n",
      "Epoch 43/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2175 - crf_viterbi_accuracy: 0.9158 - val_loss: 1.2587 - val_crf_viterbi_accuracy: 0.9142\n",
      "Epoch 44/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2163 - crf_viterbi_accuracy: 0.9177 - val_loss: 1.2583 - val_crf_viterbi_accuracy: 0.9139\n",
      "Epoch 45/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2161 - crf_viterbi_accuracy: 0.9176 - val_loss: 1.2577 - val_crf_viterbi_accuracy: 0.9142\n",
      "\n",
      "Epoch 00045: val_loss improved from 1.26118 to 1.25775, saving model to checkpoints/_entity_model45-0.91.h5\n",
      "Epoch 46/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2148 - crf_viterbi_accuracy: 0.9183 - val_loss: 1.2570 - val_crf_viterbi_accuracy: 0.9142\n",
      "Epoch 47/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2138 - crf_viterbi_accuracy: 0.9190 - val_loss: 1.2571 - val_crf_viterbi_accuracy: 0.9133\n",
      "Epoch 48/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2141 - crf_viterbi_accuracy: 0.9195 - val_loss: 1.2561 - val_crf_viterbi_accuracy: 0.9143\n",
      "Epoch 49/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2126 - crf_viterbi_accuracy: 0.9190 - val_loss: 1.2556 - val_crf_viterbi_accuracy: 0.9147\n",
      "Epoch 50/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.2121 - crf_viterbi_accuracy: 0.9197 - val_loss: 1.2546 - val_crf_viterbi_accuracy: 0.9152\n",
      "\n",
      "Epoch 00050: val_loss improved from 1.25775 to 1.25456, saving model to checkpoints/_entity_model50-0.92.h5\n"
     ]
    }
   ],
   "source": [
    "# callbacks\n",
    "from keras.callbacks import ReduceLROnPlateau, EarlyStopping, TerminateOnNaN, ModelCheckpoint\n",
    "cb_redlr = ReduceLROnPlateau(monitor='val_crf_viterbi_accuracy', factor=0.5, patience=3, min_lr=0.0001, verbose=1)\n",
    "cb_early = EarlyStopping(monitor='val_crf_viterbi_accuracy', min_delta=0, patience=5, verbose=1)\n",
    "cb_chkpt = ModelCheckpoint('checkpoints/_'+modelname+'{epoch:02d}-{val_crf_viterbi_accuracy:.2f}.h5', verbose=1, save_best_only=True, save_weights_only=True, period=5)\n",
    "\n",
    "callbacks_list=[cb_redlr, cb_early, cb_chkpt]\n",
    "\n",
    "# start training\n",
    "log = model.fit(X_train, np.array(y_train), batch_size=32, epochs=50,\n",
    "                callbacks=callbacks_list,\n",
    "                validation_split=0.1, verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot accuracies\n",
    "import pandas as pd\n",
    "hist = pd.DataFrame(log.history)\n",
    "# print(hist)\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use(\"ggplot\")\n",
    "plt.figure(figsize=(12,12))\n",
    "plt.plot(hist[\"crf_viterbi_accuracy\"], label='Training accuracy')\n",
    "plt.plot(hist[\"val_crf_viterbi_accuracy\"], label='Validation accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "500/500 [==============================] - 1s 2ms/step\n",
      "F1-score: 68.5%\n"
     ]
    }
   ],
   "source": [
    "# save model\n",
    "from keras_contrib.utils import save_load_utils\n",
    "with open('model/' + modelname + '.json', 'w') as f:\n",
    "    f.write(model.to_json())\n",
    "# save weights\n",
    "save_load_utils.save_all_weights(model, 'model/'+modelname+'.h5')\n",
    "\n",
    "# load weights\n",
    "model.load_weights('model/'+modelname+'.h5')\n",
    "\n",
    "# evaluate model on the test set\n",
    "test_pred = model.predict(X_test, verbose=1)\n",
    "\n",
    "idx2tag = {1: 'I', 0: 'O'}\n",
    "pred_labels = [[idx2tag[np.argmax(p)] for p in pred_i] for pred_i in test_pred]\n",
    "test_labels = [[idx2tag[np.argmax(p)] for p in pred_i] for pred_i in y_test]\n",
    "\n",
    "from seqeval.metrics import precision_score, recall_score, f1_score, classification_report\n",
    "print(\"F1-score: {:.1%}\".format(f1_score(test_labels, pred_labels, average='weighted')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Word           ||True ||Pred\n",
      "==============================\n",
      "what           :     0 0\n",
      "are            :     0 0\n",
      "some           :     0 0\n",
      "musical        :     0 0\n",
      "artists        :     0 0\n",
      "associated     :     0 0\n",
      "with           :     0 0\n",
      "the            :     0 0\n",
      "ones           :     0 0\n",
      "signed         :     0 0\n",
      "up             :     0 0\n",
      "with           :     0 0\n",
      "emi            :     1 1\n"
     ]
    }
   ],
   "source": [
    "# show sample test prediction\n",
    "# i = 1\n",
    "p = model.predict(np.array([X_test[i]]))\n",
    "p = np.argmax(p, axis=-1)\n",
    "true = np.argmax(y_test[i], -1)\n",
    "print(\"{:15}||{:5}||{}\".format(\"Word\", \"True\", \"Pred\"))\n",
    "print(30 * \"=\")\n",
    "for w, t, pred in zip(X_test[i], true, p[0]):\n",
    "    if w != 0:\n",
    "        print(\"{:15}: {:5} {}\".format(words[w-1], t, pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicate mentions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training on 4500 samples validating on 500 samples\n"
     ]
    }
   ],
   "source": [
    "# train entity mention span model\n",
    "y = y_p\n",
    "modelname = 'predicate_model'\n",
    "\n",
    "# prepare data\n",
    "y = pad_sequences(maxlen=max_len, sequences=y, padding=\"post\", value=0)\n",
    "from keras.utils import to_categorical\n",
    "y = [to_categorical(i, num_classes=n_tags) for i in y]\n",
    "\n",
    "# split dataset into training and testing subsets\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)\n",
    "print(\"Training on %d samples testing on %d samples\" % (len(X_train), len(X_test)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 4050 samples, validate on 450 samples\n",
      "Epoch 1/50\n",
      "4050/4050 [==============================] - 9s 2ms/step - loss: 1.5417 - crf_viterbi_accuracy: 0.8139 - val_loss: 1.5699 - val_crf_viterbi_accuracy: 0.8143\n",
      "Epoch 2/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.5236 - crf_viterbi_accuracy: 0.8139 - val_loss: 1.5464 - val_crf_viterbi_accuracy: 0.8143\n",
      "Epoch 3/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.4941 - crf_viterbi_accuracy: 0.8139 - val_loss: 1.5088 - val_crf_viterbi_accuracy: 0.8145\n",
      "Epoch 4/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.4597 - crf_viterbi_accuracy: 0.8157 - val_loss: 1.4696 - val_crf_viterbi_accuracy: 0.8218\n",
      "Epoch 5/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.4222 - crf_viterbi_accuracy: 0.8282 - val_loss: 1.4331 - val_crf_viterbi_accuracy: 0.8373\n",
      "\n",
      "Epoch 00005: val_loss improved from inf to 1.43314, saving model to checkpoints/_predicate_model05-0.84.h5\n",
      "Epoch 6/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3924 - crf_viterbi_accuracy: 0.8431 - val_loss: 1.4088 - val_crf_viterbi_accuracy: 0.8506\n",
      "Epoch 7/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3751 - crf_viterbi_accuracy: 0.8518 - val_loss: 1.3961 - val_crf_viterbi_accuracy: 0.8594\n",
      "Epoch 8/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3653 - crf_viterbi_accuracy: 0.8578 - val_loss: 1.3883 - val_crf_viterbi_accuracy: 0.8636\n",
      "Epoch 9/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3596 - crf_viterbi_accuracy: 0.8608 - val_loss: 1.3833 - val_crf_viterbi_accuracy: 0.8647\n",
      "Epoch 10/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3547 - crf_viterbi_accuracy: 0.8640 - val_loss: 1.3809 - val_crf_viterbi_accuracy: 0.8656\n",
      "\n",
      "Epoch 00010: val_loss improved from 1.43314 to 1.38087, saving model to checkpoints/_predicate_model10-0.87.h5\n",
      "Epoch 11/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3508 - crf_viterbi_accuracy: 0.8672 - val_loss: 1.3765 - val_crf_viterbi_accuracy: 0.8691\n",
      "Epoch 12/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3477 - crf_viterbi_accuracy: 0.8690 - val_loss: 1.3747 - val_crf_viterbi_accuracy: 0.8711\n",
      "Epoch 13/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3453 - crf_viterbi_accuracy: 0.8705 - val_loss: 1.3717 - val_crf_viterbi_accuracy: 0.8708\n",
      "Epoch 14/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3425 - crf_viterbi_accuracy: 0.8714 - val_loss: 1.3698 - val_crf_viterbi_accuracy: 0.8724\n",
      "Epoch 15/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3406 - crf_viterbi_accuracy: 0.8726 - val_loss: 1.3681 - val_crf_viterbi_accuracy: 0.8736\n",
      "\n",
      "Epoch 00015: val_loss improved from 1.38087 to 1.36807, saving model to checkpoints/_predicate_model15-0.87.h5\n",
      "Epoch 16/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3387 - crf_viterbi_accuracy: 0.8733 - val_loss: 1.3664 - val_crf_viterbi_accuracy: 0.8730\n",
      "Epoch 17/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3368 - crf_viterbi_accuracy: 0.8744 - val_loss: 1.3656 - val_crf_viterbi_accuracy: 0.8747\n",
      "Epoch 18/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3357 - crf_viterbi_accuracy: 0.8757 - val_loss: 1.3642 - val_crf_viterbi_accuracy: 0.8750\n",
      "Epoch 19/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3333 - crf_viterbi_accuracy: 0.8756 - val_loss: 1.3633 - val_crf_viterbi_accuracy: 0.8752\n",
      "Epoch 20/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3316 - crf_viterbi_accuracy: 0.8771 - val_loss: 1.3616 - val_crf_viterbi_accuracy: 0.8763\n",
      "\n",
      "Epoch 00020: val_loss improved from 1.36807 to 1.36157, saving model to checkpoints/_predicate_model20-0.88.h5\n",
      "Epoch 21/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3309 - crf_viterbi_accuracy: 0.8768 - val_loss: 1.3605 - val_crf_viterbi_accuracy: 0.8763\n",
      "Epoch 22/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3293 - crf_viterbi_accuracy: 0.8782 - val_loss: 1.3599 - val_crf_viterbi_accuracy: 0.8751\n",
      "Epoch 23/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3281 - crf_viterbi_accuracy: 0.8793 - val_loss: 1.3589 - val_crf_viterbi_accuracy: 0.8772\n",
      "Epoch 24/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3273 - crf_viterbi_accuracy: 0.8805 - val_loss: 1.3578 - val_crf_viterbi_accuracy: 0.8777\n",
      "Epoch 25/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3253 - crf_viterbi_accuracy: 0.8808 - val_loss: 1.3569 - val_crf_viterbi_accuracy: 0.8782\n",
      "\n",
      "Epoch 00025: val_loss improved from 1.36157 to 1.35695, saving model to checkpoints/_predicate_model25-0.88.h5\n",
      "Epoch 26/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3247 - crf_viterbi_accuracy: 0.8816 - val_loss: 1.3565 - val_crf_viterbi_accuracy: 0.8788\n",
      "Epoch 27/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3241 - crf_viterbi_accuracy: 0.8814 - val_loss: 1.3564 - val_crf_viterbi_accuracy: 0.8774\n",
      "Epoch 28/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3229 - crf_viterbi_accuracy: 0.8815 - val_loss: 1.3551 - val_crf_viterbi_accuracy: 0.8792\n",
      "Epoch 29/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3201 - crf_viterbi_accuracy: 0.8830 - val_loss: 1.3539 - val_crf_viterbi_accuracy: 0.8808\n",
      "Epoch 30/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3201 - crf_viterbi_accuracy: 0.8835 - val_loss: 1.3533 - val_crf_viterbi_accuracy: 0.8801\n",
      "\n",
      "Epoch 00030: val_loss improved from 1.35695 to 1.35328, saving model to checkpoints/_predicate_model30-0.88.h5\n",
      "Epoch 31/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3197 - crf_viterbi_accuracy: 0.8840 - val_loss: 1.3525 - val_crf_viterbi_accuracy: 0.8797\n",
      "Epoch 32/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3176 - crf_viterbi_accuracy: 0.8842 - val_loss: 1.3528 - val_crf_viterbi_accuracy: 0.8807\n",
      "Epoch 33/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3172 - crf_viterbi_accuracy: 0.8856 - val_loss: 1.3518 - val_crf_viterbi_accuracy: 0.8808\n",
      "Epoch 34/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3164 - crf_viterbi_accuracy: 0.8855 - val_loss: 1.3508 - val_crf_viterbi_accuracy: 0.8825\n",
      "Epoch 35/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3156 - crf_viterbi_accuracy: 0.8853 - val_loss: 1.3502 - val_crf_viterbi_accuracy: 0.8820\n",
      "\n",
      "Epoch 00035: val_loss improved from 1.35328 to 1.35022, saving model to checkpoints/_predicate_model35-0.88.h5\n",
      "Epoch 36/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3144 - crf_viterbi_accuracy: 0.8863 - val_loss: 1.3498 - val_crf_viterbi_accuracy: 0.8824\n",
      "Epoch 37/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3136 - crf_viterbi_accuracy: 0.8870 - val_loss: 1.3492 - val_crf_viterbi_accuracy: 0.8826\n",
      "Epoch 38/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3127 - crf_viterbi_accuracy: 0.8873 - val_loss: 1.3484 - val_crf_viterbi_accuracy: 0.8839\n",
      "Epoch 39/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3123 - crf_viterbi_accuracy: 0.8874 - val_loss: 1.3480 - val_crf_viterbi_accuracy: 0.8830\n",
      "Epoch 40/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3105 - crf_viterbi_accuracy: 0.8882 - val_loss: 1.3478 - val_crf_viterbi_accuracy: 0.8847\n",
      "\n",
      "Epoch 00040: val_loss improved from 1.35022 to 1.34777, saving model to checkpoints/_predicate_model40-0.88.h5\n",
      "Epoch 41/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3102 - crf_viterbi_accuracy: 0.8871 - val_loss: 1.3472 - val_crf_viterbi_accuracy: 0.8826\n",
      "Epoch 42/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3092 - crf_viterbi_accuracy: 0.8887 - val_loss: 1.3464 - val_crf_viterbi_accuracy: 0.8846\n",
      "Epoch 43/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3089 - crf_viterbi_accuracy: 0.8890 - val_loss: 1.3458 - val_crf_viterbi_accuracy: 0.8836\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 44/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3084 - crf_viterbi_accuracy: 0.8884 - val_loss: 1.3455 - val_crf_viterbi_accuracy: 0.8837\n",
      "Epoch 45/50\n",
      "4050/4050 [==============================] - 7s 2ms/step - loss: 1.3079 - crf_viterbi_accuracy: 0.8895 - val_loss: 1.3458 - val_crf_viterbi_accuracy: 0.8846\n",
      "\n",
      "Epoch 00045: val_loss improved from 1.34777 to 1.34581, saving model to checkpoints/_predicate_model45-0.88.h5\n",
      "Epoch 00045: early stopping\n"
     ]
    }
   ],
   "source": [
    "# callbacks\n",
    "from keras.callbacks import ReduceLROnPlateau, EarlyStopping, TerminateOnNaN, ModelCheckpoint\n",
    "cb_redlr = ReduceLROnPlateau(monitor='val_crf_viterbi_accuracy', factor=0.5, patience=3, min_lr=0.0001, verbose=1)\n",
    "cb_early = EarlyStopping(monitor='val_crf_viterbi_accuracy', min_delta=0, patience=5, verbose=1)\n",
    "cb_chkpt = ModelCheckpoint('checkpoints/_'+modelname+'{epoch:02d}-{val_crf_viterbi_accuracy:.2f}.h5', verbose=1, save_best_only=True, save_weights_only=True, period=5)\n",
    "\n",
    "callbacks_list=[cb_redlr, cb_early, cb_chkpt]\n",
    "\n",
    "# start training\n",
    "log = model.fit(X_train, np.array(y_train), batch_size=32, epochs=50,\n",
    "                callbacks=callbacks_list,\n",
    "                validation_split=0.1, verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot accuracies\n",
    "import pandas as pd\n",
    "hist = pd.DataFrame(log.history)\n",
    "# print(hist)\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use(\"ggplot\")\n",
    "plt.figure(figsize=(12,12))\n",
    "plt.plot(hist[\"crf_viterbi_accuracy\"], label='Training accuracy')\n",
    "plt.plot(hist[\"val_crf_viterbi_accuracy\"], label='Validation accuracy')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "500/500 [==============================] - 1s 1ms/step\n",
      "F1-score: 47.5%\n"
     ]
    }
   ],
   "source": [
    "# save model\n",
    "from keras_contrib.utils import save_load_utils\n",
    "with open('model/' + modelname + '.json', 'w') as f:\n",
    "    f.write(model.to_json())\n",
    "# save weights\n",
    "save_load_utils.save_all_weights(model, 'model/'+modelname+'.h5')\n",
    "\n",
    "# load weights\n",
    "model.load_weights('model/'+modelname+'.h5')\n",
    "\n",
    "# evaluate model on the test set\n",
    "test_pred = model.predict(X_test, verbose=1)\n",
    "\n",
    "idx2tag = {1: 'I', 0: 'O'}\n",
    "pred_labels = [[idx2tag[np.argmax(p)] for p in pred_i] for pred_i in test_pred]\n",
    "test_labels = [[idx2tag[np.argmax(p)] for p in pred_i] for pred_i in y_test]\n",
    "\n",
    "from seqeval.metrics import precision_score, recall_score, f1_score, classification_report\n",
    "print(\"F1-score: {:.1%}\".format(f1_score(test_labels, pred_labels, average='weighted')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Word           ||True ||Pred\n",
      "==============================\n",
      "what           :     0 0\n",
      "are            :     0 0\n",
      "some           :     0 0\n",
      "musical        :     1 1\n",
      "artists        :     0 1\n",
      "associated     :     1 1\n",
      "with           :     0 0\n",
      "the            :     0 0\n",
      "ones           :     0 0\n",
      "signed         :     0 0\n",
      "up             :     0 0\n",
      "with           :     0 0\n",
      "emi            :     0 0\n"
     ]
    }
   ],
   "source": [
    "# show sample test prediction\n",
    "i = 1\n",
    "p = model.predict(np.array([X_test[i]]))\n",
    "p = np.argmax(p, axis=-1)\n",
    "true = np.argmax(y_test[i], -1)\n",
    "print(\"{:15}||{:5}||{}\".format(\"Word\", \"True\", \"Pred\"))\n",
    "print(30 * \"=\")\n",
    "for w, t, pred in zip(X_test[i], true, p[0]):\n",
    "    if w != 0:\n",
    "        print(\"{:15}: {:5} {}\".format(words[w-1], t, pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tf36",
   "language": "python",
   "name": "tf36"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
